package cn.iocoder.yudao.module.scrm.service.customer;

import java.time.LocalDateTime;
import java.util.*;
import javax.validation.*;

import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.module.scrm.controller.admin.clue.vo.ClueImportExcelRespVO;
import cn.iocoder.yudao.module.scrm.controller.admin.customer.vo.*;
import cn.iocoder.yudao.module.scrm.dal.dataobject.customer.CustomerDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;

import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;

/**
 * SCRM客户 Service 接口
 *
 * @author admin
 */
public interface CustomerService {

    default Map<Long, CustomerDO> getCustomerMap(Collection<Long> ids) {
        return convertMap(getCustomerList(ids), CustomerDO::getId);
    }

    List<CustomerDO> getCustomerList(Collection<Long> ids);

    /**
     * 创建SCRM客户
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createCustomer(@Valid CustomerSaveReqVO createReqVO);

    /**
     * 更新SCRM客户
     *
     * @param updateReqVO 更新信息
     */
    void updateCustomer(@Valid CustomerSaveReqVO updateReqVO);

    /**
     * 更新客户的跟进状态
     *
     * @param id        编号
     * @param dealStatus 跟进状态
     */
    void updateCustomerDealStatus(Long id, Boolean dealStatus);

    /**
     * 删除SCRM客户
     *
     * @param id 编号
     */
    void deleteCustomer(Long id);

    /**
     * 获得SCRM客户
     *
     * @param id 编号
     * @return SCRM客户
     */
    CustomerDO getCustomer(Long id);

    /**
     * 获得SCRM客户分页
     *
     * @param pageReqVO 分页查询
     * @return SCRM客户分页
     */
    PageResult<CustomerDO> getCustomerPage(CustomerPageReqVO pageReqVO);

    /**
     * 更新客户相关的跟进信息
     *
     * @param id 编号
     * @param contactNextTime 下次联系时间
     * @param contactLastContent 最后联系内容
     */
    void updateCustomerFollowUp(Long id, LocalDateTime contactNextTime, String contactLastContent);

    void validateCustomer(Long id);

    void transferCustomer(TransferCustomerReqVO reqVO);

    void transferCustomerDetail(Long id, TransferCustomerReqVO reqVO);

    /**
     * 客户放入公海
     *
     * @param id 客户编号
     */
    void putCustomerPool(Long id);

    /**
     * 领取公海客户
     *
     * @param ids         要领取的客户编号数组
     * @param ownerUserId 负责人
     * @param isReceive   是/否领取；true - 领取；false - 分配
     */
    void receiveCustomer(List<Long> ids, Long ownerUserId, Boolean isReceive);

    /**
     * 【系统】客户自动掉入公海
     *
     * @return 掉入公海数量
     */
    int autoPutCustomerPool();

    /**
     * 批量导入客户或者公海 Excel
     * @param importList 数据
     * @param updateSupport 是否支持更新
     * @param clientOrPool 是否是公海
     * @return 响应
     */
    CustomerImportExcelRespVO importCustomerList(List<CustomerImportExcelVO> importList, Boolean updateSupport, Boolean clientOrPool);


    /**
     * 批量导入客户或者公海 Excel-不能进行更新，
     * @param importList 数据
     * @return 响应
     */
    CustomerImportExcelRespVO importCustomerListNotCanUpdate(List<CustomerImportExcelVO> importList);

    /**
     * 锁定/解锁客户
     *
     * @param lockReqVO 更新信息
     * @param userId    用户编号
     */
    void lockCustomer(@Valid CustomerLockReqVO lockReqVO, Long userId);

    /**
     * 修改|删除|客户库|规则--自动解锁旧的客户
     *
     * @param lockReqVO 更新信息
     */
    void autoUnlockCustomer(@Valid CustomerAutoUnlockVO  lockReqVO);


    /**
     * 转移客户的时候校验私库容量
     * @param userId 当前登陆用户
     * @param count  上传的数量
     */
    void checkCapacityRule(Long userId,int count);

    /**
     * 公海领取客户的时候进行校验
     * @param userId 当前登陆用户
     * @param count  上传的数量
     */
    void checkCapacityRuleByReceive(Long userId,int count);


    /**
     * 添加客户的时候校验私库容量
     * @param userId 当前登陆用户
     * @param count  上传的数量
     */
    void checkCapacityRuleByCreate(Long userId,int count);

}